1.[2弾-183]実行状況をプログレスバーで表示

[2001/01/21 H.Oさんからの質問]

「500連発マクロ」、大変面白く参考にさせていただいております。 その中で一つ、参考にしたいのですがどうしても使い方がわからない物があります。 自分で作ったマクロの稼働状況を見たいため、No.183の「実行状況をプログレス バーで表示する(ラベル)」を活用したいのですが、使い方がわかりません。 貴社のマクロのなかに、自分のマクロを入れたのですがうまくいきません。 自分のマクロを添付します。二日かかってもうまくいかないもやもやを解決したいの で、どうかよろしくお願いします。



Sub tanaorosi()
 --- 略 ---
Do
    Num = ws.Cells(RowPos, ColPos + 1)
    If Num = "梱包" Then
        ws.Cells(RowPos, ColPos - 9).Copy
        ws2.Cells(RowPos, ColPos - 9).PasteSpecial Paste:=xlPasteValues
    End If
    RowPos = RowPos + 1
Loop While Num <> "end"
--- 略 ---
End Sub

質問はDoステートメント使用のマクロですが、私の掲載している例題は%を 表示する関係で最終値の判っているForステートメントが対象です。 質問のサンプルはForでも出来そうなので最終セルを取得し下記に変更しました。

Sub tanaorosi()
 --- 略 ---
    Selection.SpecialCells(xlCellTypeLastCell).Select
    endr = ActiveCell.Row
For RowPos = 5 To endr
       Num = ws.Cells(RowPos, ColPos + 1)
        If Num = "梱包" Then
            ws.Cells(RowPos, ColPos - 9).Copy
            ws2.Cells(RowPos, ColPos - 9).PasteSpecial Paste:=xlPasteValues
        End If
Next
--- 略 ---
End Sub
 ---------------------------------------
上記に変更後、プログレスバーで表示を追加しました。なお、自分の作成した
Forステートメントの中にマクロを追加する件が判りずらいようなので、今回
下記のように分割しました。自分の作成したマクロに、Call puro1・・Call puro4
を追加すればよい。(追加個所は下記参照のこと)

Dim i As Integer
Dim j As Integer
Dim endr As Integer
Dim tsiz As Integer
Sub tanaorosi()
 --- 略 ---
Call puro1
For RowPos = 5 To endr
i = RowPos
Call puro2
       Num = ws.Cells(RowPos, ColPos + 1)
        If Num = "梱包" Then
            ws.Cells(RowPos, ColPos - 9).Copy
            ws2.Cells(RowPos, ColPos - 9).PasteSpecial Paste:=xlPasteValues
        End If
Call puro3   
Next
Call puro4
--- 略 ---
End Sub
'-----------------------------
Sub puro1()
'ダイアログへ表示
With UserForm1
    .Caption = "マクロ実行中:しばらくお待ち下さい"
    .Label1.BackColor = RGB(255, 255, 0)
    .Label2.TextAlign = fmTextAlignCenter
    .Label2.BackStyle = 0
    .Label1.Width = 0
    tsiz = .Label2.Width
End With
UserForm1.Show vbModeless
End Sub
'-----------------------------
Sub puro2()
'進行計算
    j = i / endr * 100
    With UserForm1
        .Label2.Caption = Int(j) & "%"
        .Label1.Width = tsiz * j / 100
    End With
End Sub
'-----------------------------
Sub puro3()
'プログレス表示
   DoEvents
End Sub
'-----------------------------
Sub puro4()
'ダイアログを閉じる
  Unload UserForm1
End Sub
'-----------------------------
2001/1/22 (月) 21:51 下記メールを受信
井領さん、なんとお礼を申し上げてよいかわかりません。 正直、編集部宛にメールを出して、返事が来るのか だめもとの気持ちでした。 それが次の日に、しかもマクロを添削してくれて返事が来るなんて! マクロは動きました。感激です! もしこのまま完成せず、もやもやした気持ちのままのコンピューターライフだったら、 マクロへの興味は薄れていったかもしれません。 ますますマクロが面白くなりました! 有り難うございました。

2.[2弾-他1]テキストボックスの日付型表示

[2001/02/07 S.Zさんからの質問]
ExcelVBAマクロ500連発を購入しました。 教えてほしいことがあるのですが、 テキストボックスの値を日付型(例えば)2001/1/2というように、 設定したいのですが、どうすればいいのでしょうか?

------------------------------------------------------------
何処にあるテキストボックスか上記では判りませんが、もしワークシート上 に書いたテキストボックスであればFormatの指定は出来ないと思います。

ユーザーフォームに書いたテキストボックスなら日付型の指定が出来ます。 下記のMacro1の方は、UserForm1を表示させTextBox1に1/2と入力しダブルクリック すれば2001/1/2になります。

Macro2の方は、セル"A1"に1/2と記述しこのマクロを実行すればテキストボックス に2001/1/2と表示されます。(2001はPCのシステム日付が2001の場合)

Sub Macro1()
    UserForm1.Show
End Sub
Private Sub TextBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
   UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "yyyy/m/d")
End Sub

'------------------------------------------------------------
Sub Macro2()
    UserForm1.Show
    ddd = Range("A1").Value
    UserForm1.TextBox1.Value = Format(ddd, "yyyy/m/d")
End Sub
質問の内容と異なっているようでしたら再度メールを下さい。
3.[2弾-171]オ-トフィルタで抽出し結果を別シートへ張付

[2001/02/23 M.Tさんからの質問]
初めてお便りします。 私はVBAを始めた54歳の初心者です。VBAマクロ500連発を 参考にして勉強しています。 非常に初歩的な質問で申し訳ないのですが、 是非教えて下さい。

number171"オートフィルターの抽出結果を追加した シートに貼り付ける"に関しての質問です。 小生のデータベースには、受注日列 2001/04/01と 納期列 2001年4月10日と二つの検索したい列が あります。顧客番号とか顧客名とかでは、スムーズに 動作してくれるのですが、この2列の検索は上手く いきません。 原因は日付の文字列と、入力した数値が検索で 一致しないからだと思います。 試した事は
[1]textbox1に、かなで2001年4月10日と入力。
[2]々     、かなで2001/04/10。
[3]Textbox1.Value=Format(Textbox1.Value,"yyyy/mm/dd")
[4]intyear=(CDate(Userform1.Textbox1.Text))
month,dayも同様にして
 Textbox1Text=intyear & "年” & intmonth & "月".......
[5]"yyyy""年""mm""月""dd""日"""
と代入してもいずれも敗退しました。

成功したのは、 この2列のセル書式を標準にして、シリアル値に変換 すれば、シリアル値でオートフィルターは可能なのですが、 テキストボックスにシリアル値を入れるのは難しいです。 テキストボックスには、出来れば04/01、駄目ならば 2001/04/01といった日付入力をして検索したいのです。 値の一致のさせ方を教えて下さい。ここで詰まって3日目 なのでお助け下さい。
------------------------------------------------------------
先週下記のような質問があり、29-73へ掲載しました同じ内容ですがここにも掲載します。
「ユーザーフォーム上にふたつのテキストボックスがあり、 それぞれ、シート1のA列とB列に入っているデータを記入し、 コマンドボタンを押すと、そこから検索して、C列のデータを探して、 ユーザーフォーム上のラベル1に表示させたいのですが、どのように すればよろしいのでしょうか?」




上図のようにダイアロルへ入力すると、左図のように表示するマクロの作り方を 説明します。

[1] aaa()実行でダイアログを表示
[2] 「検索」ボタンクリックでaaa1()実行


---------------------------------------------------------
ポイント1.オ-トフィルタはセルに表示されている形式と合わないと抽出できません。 したがって下記のように入力したデータをセル表示に合わせる。

UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "m""月""d""日""")
---------------------------------------------------------
ポイント2.下記セルの表示が[1][2][3]は問題なし。[4][5][6]は手で「データ」「フィルタ」 「オートフィルタ」で行なった場合は問題ないが、何故かマクロでは抽出できない、 何故ダメなのか判らないがExcel95の時からずーと同じです。Excel2000で改善されること を期待したいたがダメだった。しょうがないので[3]の年2桁で行なって下さい、 もしこそれも問題がある場合は再度メールを下さい

[1]Format(UserForm1.TextBox1.Text, "m""月""d""日""") セル表示:1月2日 可
[2]Format(UserForm1.TextBox1.Text, "m/d")      セル表示:1/2 可
[3]Format(UserForm1.TextBox1.Text, "yy/m/d")    セル表示:01/1/2 可

[4]Format(UserForm1.TextBox1.Text, "ge.m.d") セル表示:H13.1.2 不可
[5]Format(UserForm1.TextBox1.Text, "yy/m/d") セル表示:2001/1/2 不可
[6]Format(UserForm1.TextBox1.Text, "ggge""年""m""月""d""日""")セル表示:平成13年1月2日 不可


Sub aaa()
UserForm1.Show
End Sub

Sub aaa1()
dat = ""

UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "m""月""d""日""")

hizuke = UserForm1.TextBox1.Text
meigara = UserForm1.TextBox2.Text
'フィルタ
Range("A3").Select
Selection.AutoFilter
    Selection.AutoFilter Field:=2, Criteria1:=hizuke, Operator:=xlAnd
    Selection.AutoFilter Field:=3, Criteria1:=meigara, Operator:=xlAnd
    
'C列データ取得
  Range("a4").CurrentRegion.SpecialCells(xlVisible).Select
   For Each sel In Selection
        r = sel.Row
        If r <> 2 Then
            dat = Cells(r, 4)
            Exit For
        End If
   Next sel
If dat = "" Then
   dat = "抽出条件のデータなし"
End If
UserForm1.Label1.Caption = dat
Range("A2").Select
'フィルタ戻す
Selection.AutoFilter
End Sub
------------------------------------------------------------
上記で質問への返事は終わりですが、どうしても年を4桁で抽出したい場合 は下記の方法があります。本例は抽出した行をメッセージボックスへ表示する だけですが、配列へ入れ後からその行のみ処理すればフィルタで抽出したのと 同じことが出来ます。(フィルタ処理に比べ時間が掛かる)

Dim meigara As Date
Sub Macro1()
  ActiveCell.SpecialCells(xlLastCell).Select
  endr = ActiveCell.Row
  Range(Cells(2, 2), Cells(endr, 2)).Select
  
  hizuke = UserForm1.TextBox1.Text
  
  For Each sel In Selection
        If sel.Value = hizuke Then
            sel.Select
            selr = ActiveCell.Row
            MsgBox "対象のセルは「" & selr & "「にあります"
        End If
    Next sel
Range("A1").Select
End Sub

4.[2弾-他2]入力した数値をカンマ付きへ変換

[2001/02/23 M.Tさんからの質問(上記と同じ方ですが質問内容が異なるので項目を分けた)]
ついでにもう1点、データベースの数値が111,222とコンマ がついている場合、入力もコンマ付きでないと検索できません。 111222といれた数値を111,222と変換する魔法をお教え下さい。 誠に初歩的な質問で申し訳ありませんが、お願い申し上げます。

魔法でも何でもないが、下記[1]でOKのはずです。なお、昔作った サンプルがあったのでついでに掲載したが[2]でもいいと思います。

[1].Formatでカンマを付ける
UserForm1.TextBox1.Text = Format(UserForm1.TextBox1.Text, "#,###")
kanma = UserForm1.TextBox1.Text

[2].桁数をチェックしカンマを付ける
kanma = UserForm1.TextBox1.Text
    aas = Len(kanma)
    If aas > 6 Then
            s1 = Right(kanma, 3)
            s2 = Mid(kanma, 1, aas - 3)
            s2 = Right(s2, 3)
            s3 = Mid(kanma, 1, aas - 6)
            kanma = s3 & "," & s2 & "," & s1
    ElseIf aas > 3 Then
            s1 = Right(kanma, 3)
            s2 = Mid(kanma, 1, aas - 3)
         kanma = s2 & "," & s1
    End If

5.[2弾-他3]コマンドボタンについて

[2001/03/09 U.Cさんからの質問]
ExcelVBAマクロ500連発第2弾各パーツについている「実行ボタン」について、 おせわになります各パーツを実行するための「実行」ボタン、右クリックしてもプロパテイと コードの表示がでません どのようにしたらよいでしょうか ちなみに隣に自分でコマンドボタンを作成したものは表示されます パソコンへは、「XLSINST.exe」でインストールしました この本の内容をぜひとも理解したいと思い読んでおります。
上図の左図はメニューの[表示][ツールバー][フォーム]で描いたものです。
右図はメニューの[表示][ツールバー][コントロールツールボックス]で描いたもの。

※ ワ−クシ−トにコマンドボタンを表示しそれをクリックしてマクロを実行させる事が よくあるが、15.5KBのExcelファイルにActiveXコントロ−ル(上図の右図)の コマンドボタンを貼り付けクリックイベントで実行する場合は25.5KBの容量になった。 それに比べフォ−ム(OLEカスタムコントロ−ル:上図の左図)のコマンドボタンを 使用した場合は16.0KBで 0.5KB増えただけである。単純にあるマクロを実行させる だけであれば、私の場合フォ−ム(上図の左図)のコマンドボタンを使用している。

質問と回答が合っているかどうか不明ですが返事は以上です。


テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル